#ifndef COMPUTING_H
#define COMPUTING_H

#include <qmath.h>
#include <QDateTime>
#include <QList>
#include <QDebug>

#include "aaplus/AA+.h"


// градусов в полном круге
#define FullRoundDeg 360
// градусов в одной титхе
#define TithaDeg 12
// секунд времени в одном градусе геогр. долготы
#define SecsInLngDeg 240
// миллисекунд в секунде
#define MSecsInSec 1000
// секунд в минуте
#define SecsInMin 60
// минут в часе
#define MinsInHour 60
// часов в сутках дня
#define HoursInDay 24
//---------------------------------------------------------------------------------


// Титхи
struct CTithi
{
public:
    CTithi() {dtBegin = QDateTime::currentDateTimeUtc(); dtEnd = QDateTime::currentDateTimeUtc(); num = 0; paksha = true;}

    QDateTime dtBegin, dtEnd; // начало, конец
    quint8 num; //1-15
    bool paksha; //true - шукла-пакша, false - кришна-пакша

    bool IsValid();
    bool IsEkadash() {if (11 == num) return true; else return false;}
    quint8 Num() {return num;}

    /* Вывод ввиде строки */
    QString NameStr();
    QString AsTithiStr();
    QString AsTithiStrExt();
    QString AsCurTithiStr();
    QString AsEkadashStr();

    /* округление времени до минуты */
    void RoundToMin();
};
//---------------------------

/* Уравнение времени
    N - номер дня в году: 1 для первого января и т.д.
    возвращает: смещение времени в минутах */
double TimeEquation(int N);

/* Возвращает номер титхи от 1 до 30 для заданной переменной даты-времени */
quint8 TithaNum(QDateTime dt);

/* Поиск времени начала и конца текущей титхи
    timeZoneOffset - смещение в часах от "универсального мирового времени" UTC
*/
CTithi SearchForCurrentTitha(double timeZoneOffset);

/* Поиск титх в заданном диапазоне даты-времени, переменные QDateTime должны быть обязательно
 * инициализированы как UTC дата-время
 * timeZoneOffset - смещение в часах от "универсального мирового времени" UTC
 */
QList<CTithi> SearchForTithi(QDateTime& date1, QDateTime& date2, double timeZoneOffset);

/* Поиск экадашей в заданном диапазоне даты-времени, переменные QDateTime должны быть обязательно
 * инициализированы как UTC дата-время
 * timeZoneOffset - смещение в часах от "универсального мирового времени" UTC
*/
QList<CTithi> SearchForEkadashi(QDateTime& date1, QDateTime& date2, double timeZoneOffset);

/*
 * Получить номер текущего года в: Кали-юге, МахаЮге, Манвантаре и т.д. основываясь на общеизвестной дате начала Кали-юги по Грегорианскому календарю
 * 18 февраля 3102 года до нашей эры
 * в случае не верного аргумента возвращается 0
 */
quint64 GregorianToVedicKaliYuga(qint32 year);
quint64 GregorianToVedicMahaYuga(qint32 year);
quint64 GregorianToVedicManvantara(qint32 year);
quint64 GregorianToVedicKalpa(qint32 year);
quint64 GregorianToVedicMahaKalpa(qint32 year);
//---------------------------------------------------------------------------------

#endif // COMPUTING_H
